package com.example.rabbitmq.config;

import com.example.rabbitmq.Constants;
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class RabbitMQDlxConfig {

    @Bean("dlxExchange")
    public Exchange dlxExchange() {
        //默认持久化是true的，如果没有显示指定的话
        //可以通过durable(false)的方式来显示指定不需要持久化
        return ExchangeBuilder.topicExchange(Constants.DLX_EXCHANGE).build();
    }

    @Bean("dlxQueue")
    public Queue dlxQueue() {
        //需要显示指定是否需要持久化
        return QueueBuilder.durable(Constants.DLX_QUEUE).build();
    }

    @Bean("dlxBinding")
    public Binding dlxBinding(@Qualifier("dlxExchange") Exchange exchange, @Qualifier("dlxQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with("dlx").noargs();
    }

    @Bean("normalExchange")
    public Exchange normalExchange() {
        //默认持久化是true的，如果没有显示指定的话
        //可以通过durable(false)的方式来显示指定不需要持久化
        return ExchangeBuilder.topicExchange(Constants.NORMAL_EXCHANGE).build();
    }

    @Bean("normalQueue")
    public Queue normalQueue() {
        //正常队列绑定死信队列
        Map<String,Object> map = new HashMap<>();
        //绑定死信队列
        map.put("x-dead-letter-exchange",Constants.DLX_EXCHANGE);
        map.put("x-dead-letter-routing-key","dlx");
        //制造死信发生的条件
//        map.put("x-message-ttl",5000);//10s过期
        map.put("x-max-length",5);//队列最大长度
        return QueueBuilder.durable(Constants.NORMAL_QUEUE).withArguments(map).build();
    }

    @Bean("normalBinding")
    public Binding normalBinding(@Qualifier("normalExchange") Exchange exchange, @Qualifier("normalQueue") Queue queue) {
        return BindingBuilder.bind(queue).to(exchange).with("normal").noargs();
    }

}
